package com.android.support.lib.universal.http;

import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

/**
 * 纯java的Http请求，不需要任何第三方库的支持。
 * Created by 彭治铭 on 2016/4/22.
 */
public class HttpUtils {
    //回调接口
    public interface RequestCallBack {
        public void onFailure(String result);

        public void onSuccess(String result);
    }

    /**
     * 向指定 URL 发送Get方法的请求(内部新开了线程，所以无论UI主线程还是后台线程都可执行)
     *
     * @param url             发送请求的 URL
     * @param params          请求参数 Map集合(方法内部会自动拼接成 name1=value1&name2=value2 的字符串形式)
     * @param RequestCallBack 回调接口
     */
    public static void sendGet(final String url, final Map<String, String> params, final RequestCallBack RequestCallBack) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    String result = "";
                    BufferedReader in = null;
                    StringBuffer sb = new StringBuffer();
                    for (Map.Entry<String, String> e : params.entrySet()) {
                        sb.append(e.getKey());
                        sb.append("=");
                        sb.append(e.getValue());
                        sb.append("&");
                    }
                    String urlNameString = url + "?" + sb.substring(0, sb.length() - 1);
                    URL realUrl = new URL(urlNameString);
                    // 打开和URL之间的连接
                    URLConnection connection = realUrl.openConnection();
                    connection.setConnectTimeout(2000);//超时连接，超过这个时间还没连接上，就会连接失败
                    // 设置通用的请求属性
                    connection.setRequestProperty("accept", "*/*");
                    connection.setRequestProperty("connection", "Keep-Alive");
                    connection.setRequestProperty("user-agent",
                            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                    // 建立实际的连接
                    connection.connect();
                    // 获取所有响应头字段
                    Map<String, List<String>> map = connection.getHeaderFields();
                    // 遍历所有的响应头字段
                    for (String key : map.keySet()) {
                        System.out.println(key + "--->" + map.get(key));
                    }
                    // 定义 BufferedReader输入流来读取URL的响应
                    in = new BufferedReader(new InputStreamReader(
                            connection.getInputStream()));
                    String line;
                    while ((line = in.readLine()) != null) {
                        result += line;
                    }
                    // 使用finally块来关闭输入流
                    try {
                        if (in != null) {
                            in.close();
                        }
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                    RequestCallBack.onSuccess(result);
                } catch (Exception e) {
                    RequestCallBack.onFailure(e.getMessage());
                }
            }
        }.start();
    }

    /**
     * 向指定 URL 发送POST方法的请求(内部新开了线程，所以无论UI主线程还是后台线程都可执行)
     *
     * @param url             发送请求的 URL
     * @param params          请求参数 Map集合
     * @param RequestCallBack 回调接口
     */
    public static void sendPost(final String url, final Map<String, String> params, final RequestCallBack RequestCallBack) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    PrintWriter out = null;
                    BufferedReader in = null;
                    String result = "";
                    URL realUrl = new URL(url);
                    // 打开和URL之间的连接
                    URLConnection conn = realUrl.openConnection();
                    conn.setConnectTimeout(2000);//超时连接，超过这个时间还没连接上，就会连接失败
                    // 设置通用的请求属性
                    conn.setRequestProperty("accept", "*/*");
                    conn.setRequestProperty("connection", "Keep-Alive");
                    conn.setRequestProperty("user-agent",
                            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                    // 发送POST请求必须设置如下两行
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    // 发送请求参数
                    StringBuffer sb = new StringBuffer();
                    for (Map.Entry<String, String> e : params.entrySet()) {
                        sb.append(e.getKey());
                        sb.append("=");
                        sb.append(e.getValue());
                        sb.append("&");
                    }
                    // 获取URLConnection对象对应的输出流
                    out = new PrintWriter(conn.getOutputStream());
                    out.print(sb.substring(0, sb.length() - 1));
                    // flush输出流的缓冲
                    out.flush();
                    // 定义BufferedReader输入流来读取URL的响应
                    in = new BufferedReader(
                            new InputStreamReader(conn.getInputStream(), "UTF-8"));
                    String line;
                    while ((line = in.readLine()) != null) {
                        result += line;
                    }
                    try {
                        if (out != null) {
                            out.close();
                        }
                        if (in != null) {
                            in.close();
                        }
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    RequestCallBack.onSuccess(result);
                } catch (Exception e) {
                    RequestCallBack.onFailure(e.getMessage());
                }
            }
        }.start();
    }

    /**
     * 向指定 URL 发送POST方法的请求(运行在后台线程，不能在UI主线程中运行。)
     *
     * @param url    发送请求的 URL
     * @param entity 请求参数，请求参数应该是 name1=value1&name2=value2 的字符串形式。
     * @return 返回服务器数据
     */
    public static String httpPost(String url, String entity) {
        URL u = null;
        HttpURLConnection con = null;
        try {
            u = new URL(url);
            con = (HttpURLConnection) u.openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);
            con.setRequestProperty("Accept", "application/json");
            con.setRequestProperty("Content-Type", "application/json");
            OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
            osw.write(entity);
            osw.flush();
            osw.close();
        } catch (Exception e) {
            Log.e("test", "Http请求异常" + e.getMessage());
        }
        StringBuffer buffer = new StringBuffer();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(con
                    .getInputStream(), "UTF-8"));
            String temp;
            while ((temp = br.readLine()) != null) {
                buffer.append(temp);
                buffer.append("\n");
            }
        } catch (Exception e) {
            Log.e("test", "Http接收异常" + e.getMessage());
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
        return buffer.toString();
    }
}
